package saei.persistencia.DAO;

import java.util.List;

import org.hibernate.Query;

import saei.bean.Asignacion;
import saei.bean.Equipo;
import saei.bean.EquipoAsignado;
import saei.bean.Representacion;
import saei.bean.Usuario;
import saei.bean.parametros.Sector;

@SuppressWarnings({"rawtypes","unchecked"})
public class AsignacionDAO extends EntidadPersistenteDAO {
	
	public static Asignacion buscarAsignacionPorNumero(int numeroAsignacion) {
		List lista = null;
		
		String fromQuery = "from Asignacion where numeroAsignacion = :numeroAsignacion";
		Query query = getSession().createQuery(fromQuery);
		query.setInteger("numeroAsignacion", numeroAsignacion);
		lista = query.list();
		
		return (Asignacion) (lista != null && lista.size() > 0 ? lista.get(0) : null);
	}

	public static List<Asignacion> buscarAsignaciones(Representacion representacion, Sector sector, Usuario usuario) {
		return buscarAsignaciones(representacion, sector, usuario, false);
	}
	
	public static List<Asignacion> buscarAsignacionesActivas() {
		String fromQuery = " from Asignacion where fechaBaja is null";
		Query query = getSession().createQuery(fromQuery);
		
		return query.list();
	}
	
	public static Asignacion buscarAsignacionActiva(Equipo equipo) {
		String fromQuery = " from EquipoAsignado where fechaBaja is null " +
				"and equipo = :equipo";
		Query query = getSession().createQuery(fromQuery);
		query.setEntity("equipo", equipo);
		List l = query.list();
		
		Asignacion asignacion = null;
		
		if (l != null && l.size() > 0) {
			EquipoAsignado ea = (EquipoAsignado) l.get(0);
			asignacion = ea.getAsignacion();
		}
		
		return asignacion;
	}
	
	public static Asignacion buscarAsignacionActiva(Representacion representacion, Sector sector, Usuario usuario) {
		List l = buscarAsignaciones(representacion, sector, usuario, true);
		return (Asignacion) (l != null && l.size() > 0 ? l.get(0) : null);
	}
	
	public static int buscarUltimoNumeroUsado() {
		String fromQuery = " select max(numeroAsignacion) from Asignacion";
		Query query = getSession().createQuery(fromQuery);
		Integer maxNum = (Integer) query.uniqueResult();
		
		return maxNum;
	}
	
	private static List<Asignacion> buscarAsignaciones(Representacion representacion, Sector sector, Usuario usuario, boolean soloActiva) {		
		String fromQuery = "from Asignacion where 1 = 1 ";
		
		if (usuario != null) {
			fromQuery += " and usuario = :usuario ";
		} else {
			fromQuery += " and representacion = :representacion ";
			fromQuery += sector != null ? " and sector = :sector " : " and sector is null";
			fromQuery += " and usuario is null";
		}
		
		if (soloActiva)
			fromQuery += " and fechaBaja is null ";
		
		Query query = getSession().createQuery(fromQuery);
		
		if (usuario != null) {
			query.setEntity("usuario", usuario);
		} else {
			query.setEntity("representacion", representacion);
			
			if(sector != null)
				query.setEntity("sector", sector);
		}
		
		return query.list();
	}
	
}
